home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / dtm / codestorage.c next >
C/C++ Source or Header  |  1991-06-18  |  2KB  |  74 lines

  1. /*
  2.    File: codestorage.c
  3.    stores code until it may be written to disk
  4. */
  5. #include <stdio.h>
  6. #include <tmc.h>
  7. #include <cvr.h>
  8. #include "codestorage.h"
  9.  
  10. /*
  11.    Code generation is driven by traversing the abstract syntax trees.
  12.    This means that code generated for a definition must be stored
  13.    temporarily until the code of all of its local definitions has
  14.    been written to disk, after which it may also be written to disk.
  15. */
  16. #define MaxDepth 40            /* Max depth of definitions */
  17. #define MaxLength 80            /* Max length of line */
  18.  
  19. typedef struct coderec
  20.     { string code;
  21.       struct coderec *next;
  22.     } *codelist;
  23. #define codelistNIL ((codelist)0)
  24.  
  25.  
  26. static codelist code_head = codelistNIL;
  27. static codelist code_tail = codelistNIL;
  28. char line_buffer [MaxLength];        /* Code just generated */
  29.  
  30. /*
  31.    Enter new code
  32. */
  33. void enter_new_code (s)
  34.  char *s;
  35.     { codelist cl = (codelist) ckmalloc (sizeof (struct coderec));
  36.       cl -> code = new_string (s);
  37.       cl -> next = codelistNIL;
  38.       if (code_tail == codelistNIL)
  39.          { code_head = code_tail = cl; }
  40.       else
  41.          { code_tail -> next = cl;
  42.            code_tail = cl;
  43.          };
  44.     };
  45.  
  46. /*
  47.    Enter new routine: set up administration to store code
  48. */
  49. void init_codebuffer (f)
  50.  FILE *f;
  51.     { if (code_tail != codelistNIL)
  52.          { fprintf (stderr, "Code buffer not empty, flushed\n");
  53.            flush_codebuffer (f);
  54.          };
  55.       enter_new_code ("");
  56.     };
  57.  
  58. /*
  59.    Write code of current routine to disk
  60. */
  61. void flush_codebuffer (f)
  62.  FILE *f;
  63.     { codelist ptr;
  64.       ptr = code_head;
  65.       while (ptr != codelistNIL)
  66.          { codelist ptr2 = ptr;
  67.            ptr = ptr -> next;
  68.            fprintf (f, "%s\n", ptr2 -> code);
  69.            free (ptr2 -> code);
  70.            free (ptr2);
  71.          };
  72.       code_tail = codelistNIL;
  73.     };
  74.